﻿//
// Copyright (c) 2011 Canyala Innovation AB
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and 
// associated documentation files (the "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
// copies of the Software, and to permit persons to whom the Software is furnished to do so, 
// subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT 
// NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH 
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
//

using System.Text;

namespace Canyala.Lagoon.Models
{
    /// <summary>
    /// Provides a NamedRowColumn composite value type.
    /// </summary>
    public class NamedRowColumn : RowColumn
    {

        public readonly string Name;

        public NamedRowColumn(int row, int column, string name)
            : base(row, column)
        {
            Name = name;
        }

        public static NamedRowColumn Create(int row, int column, string name)
        {
            return new NamedRowColumn(row, column, name);
        }

        public static new NamedRowColumn Empty = new NamedRowColumn(0, 0, string.Empty);
        public static new NamedRowColumn[] EmptyArray = new NamedRowColumn[0];

        public override bool Equals(object obj)
        {
            if (!base.Equals(obj))
                return false;

            var namedRowColumn = obj as NamedRowColumn;

            if (namedRowColumn == null) 
                return false;

            if (Name != namedRowColumn.Name) 
                return false;

            return true;
        }

        public override int GetHashCode()
        {
            return base.GetHashCode() ^ Name.GetHashCode();
        }

        public override string ToString()
        {
            var builder = new StringBuilder();
            builder.AppendFormat("{0} ({1},{2})", Name, Row, Column);
            return builder.ToString();
        }
    }
}
